Skip to content

Add ECMA-335 EnC metadata delta writer#20019

Draft
NatElkins wants to merge 1 commit into
dotnet:mainfrom
NatElkins:enc-metadata-delta-writer
Draft

Add ECMA-335 EnC metadata delta writer#20019
NatElkins wants to merge 1 commit into
dotnet:mainfrom
NatElkins:enc-metadata-delta-writer

Conversation

@NatElkins

Copy link
Copy Markdown
Contributor

Summary

Adds an internal, standalone ECMA-335 Edit-and-Continue metadata delta writer to AbstractIL, with focused System.Reflection.Metadata-readable metadata tests. It has no behavior change and no in-tree semantic consumer yet; the consumer is the F# hot reload work in #19941. This follows the same upstreaming pattern as #20017 and #20018: land isolated infrastructure first, with deterministic byte and layout evidence, then wire the feature in a later PR.

What

Ten new internal AbstractIL files (file names kept from the development branch for diffability):

  • ILDeltaHandles - offset/handle primitives, coded-index discriminated unions, delta tokens
  • ILMetadataHeaps - heap sizes and offset bookkeeping
  • IlxDeltaStreams - user-string and standalone-signature token calculators (continue numbering from a baseline)
  • DeltaMetadataEncoding - ECMA-335 II.24.2.6 coded-index encoding
  • DeltaMetadataTypes - the writer's input model: plain row-description records (method/parameter/property/event rows, method-semantics updates, custom attribute rows) and the definition key types
  • DeltaMetadataTables / DeltaTableLayout / DeltaIndexSizing / DeltaMetadataSerializer - delta #- table stream, heap construction, layout and index sizing, EncLog/EncMap emission, generation GUID chaining
  • FSharpDeltaMetadataWriter - the coordinating writer

The writer's inputs are row records (names, tokens, signature blobs, RVAs) plus baseline heap offsets and row counts. It imports nothing from any diffing, baseline, or session machinery; a grep gate for such imports is part of how the extraction was validated. One line of ilwrite.fsi exposes the pre-existing markerForUnicodeBytes so the delta writer reuses the full writer's exact string-marker logic.

Tests

130 tests in tests/FSharp.Compiler.Service.Tests/DeltaMetadata/:

  • coded-index encodings asserted against the production Encoding.CodedIndices definitions, with ECMA-335 II.24.2.6 table order cross-checked against System.Reflection.Metadata's TableIndex as an independent reference;
  • System.Reflection.Metadata reader parity over emitted deltas (SrmReaderParityTests);
  • EncLog/EncMap correctness, stream layout, heap and index sizing;
  • multi-generation chaining with generation-2 heap offsets asserted against computed expected values;
  • standalone-signature delta rows asserted at baseline + 1 from a real seeded baseline;
  • serializer failure paths.

All additions are internal; no public surface area change.

Adds an internal, standalone ECMA-335 Edit-and-Continue metadata delta writer to
AbstractIL: delta #- table stream and heap construction (DeltaMetadataTables,
DeltaMetadataSerializer, DeltaTableLayout, DeltaIndexSizing), ECMA-335 II.24.2.6
coded-index encoding (DeltaMetadataEncoding), EncLog/EncMap emission, generation GUID
chaining, user-string and standalone-signature token calculators (IlxDeltaStreams),
and the coordinating writer (FSharpDeltaMetadataWriter) over a plain row-description
input model (DeltaMetadataTypes, ILDeltaHandles, ILMetadataHeaps).

The writer's inputs are row records (names, tokens, signatures, RVAs) plus heap
offsets; it has no dependency on any semantic diffing or session machinery. It
compiles with no in-tree consumer by design: the consumer is the F# hot reload work
in dotnet#19941, following the same upstreaming pattern as dotnet#20017 and dotnet#20018
(land isolated, test-covered infrastructure first, wire the feature in a later PR).

One line of ilwrite.fsi is touched to expose the pre-existing markerForUnicodeBytes
so the delta writer reuses the exact string-marker logic of the full writer. No
behavior change for any existing code path.

Tests (130): coded-index encodings asserted against the production definitions and
ECMA-335 II.24.2.6 order, System.Reflection.Metadata reader parity over emitted
deltas, EncLog/EncMap correctness, stream layout, heap and index sizing,
multi-generation heap-offset chaining asserted against computed expected values,
standalone-signature rows asserted at baseline+1 from a real seeded baseline, and
serializer failure paths.
@NatElkins NatElkins force-pushed the enc-metadata-delta-writer branch from bf3d940 to 73cc205 Compare July 1, 2026 21:47
@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

❗ Release notes required

You can open this PR in browser to add release notes: open in github.dev


✅ Found changes and release notes in following paths:

Change path Release notes path Description
src/Compiler docs/release-notes/.FSharp.Compiler.Service/11.0.100.md

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: New

Development

Successfully merging this pull request may close these issues.

1 participant